﻿//----------------------------------------------------------------
// Desc: 注册表USR键访问
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2011-04-18
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


#if FUEL_OS_WINDOWS


class IFRegedit : public IFMemObject
{
protected:
    explicit IFRegedit()
    {}

public:
    // 注册表位置是否打开
    virtual bool IsOpen() = 0;
    // 写入字符串
    // .keyname 键名
    // .strValue 键值
    FINLINE bool WriteString (const NCHAR* keyname, const NCHAR* strValue);
    virtual bool WriteStringW(const WCHAR* keyname, const WCHAR* strValue) = 0;
    FINLINE bool WriteStringA(const ACHAR* keyname, const ACHAR* strValue);
    // 写入整型
    // .keyname 键名
    // .dwValue 键值
    FINLINE bool WriteInt (const NCHAR* keyname, int dwValue);
    virtual bool WriteIntW(const WCHAR* keyname, int dwValue) = 0;
    FINLINE bool WriteIntA(const ACHAR* keyname, int dwValue);
    // 写入GUID
    // .keyname 键名
    // .guidValue 键值
    FINLINE bool WriteGUID (const NCHAR* keyname, FGUID guidValue);
    virtual bool WriteGUIDW(const WCHAR* keyname, FGUID guidValue) = 0;
    FINLINE bool WriteGUIDA(const ACHAR* keyname, FGUID guidValue);
    // 写入BOOL
    // .keyname 键名
    // .bValue 键值
    FINLINE bool WriteBool (const NCHAR* keyname, bool bValue);
    virtual bool WriteBoolW(const WCHAR* keyname, bool bValue) = 0;
    FINLINE bool WriteBoolA(const ACHAR* keyname, bool bValue);
    // 读取字符串
    // .keyname 键名
    // .strValue 键值
    // .strDefault 如果不存在的时候，默认值
    FINLINE bool ReadString (const NCHAR* keyname, NCHAR* strValue, DWORD& dwLength, const NCHAR* strDefault);
    virtual bool ReadStringW(const WCHAR* keyname, WCHAR* strValue, DWORD& dwLength, const WCHAR* strDefault) = 0;
    virtual bool ReadStringA(const ACHAR* keyname, ACHAR* strValue, DWORD& dwLength, const ACHAR* strDefault) = 0;
    // 读取整型
    // .keyname 键名
    // .strValue 键值
    // .strDefault 如果不存在的时候，默认值
    FINLINE bool ReadInt (const NCHAR* keyname, int* pdwValue, int dwDefault);
    virtual bool ReadIntW(const WCHAR* keyname, int* pdwValue, int dwDefault) = 0;
    FINLINE bool ReadIntA(const ACHAR* keyname, int* pdwValue, int dwDefault);
    // 读取GUID
    // .keyname 键名
    // .strValue 键值
    // .guidDefault 如果不存在的时候，默认值
    FINLINE bool ReadGUID (const NCHAR* keyname, FGUID* pGuidValue, FGUID& guidDefault);
    virtual bool ReadGUIDW(const WCHAR* keyname, FGUID* pGuidValue, FGUID& guidDefault) = 0;
    FINLINE bool ReadGUIDA(const ACHAR* keyname, FGUID* pGuidValue, FGUID& guidDefault);
    // 读取BOOL
    // .keyname 键名
    // .strValue 键值
    // .bDefault 如果不存在的时候，默认值
    FINLINE bool ReadBool (const NCHAR* keyname, bool* pbValue, bool bDefault);
    virtual bool ReadBoolW(const WCHAR* keyname, bool* pbValue, bool bDefault) = 0;
    FINLINE bool ReadBoolA(const ACHAR* keyname, bool* pbValue, bool bDefault);
};

extern FAPI IFRegedit* FNewRegeditW(FNEW_FUNC_API, const WCHAR* localname);
extern FAPI IFRegedit* FNewRegeditA(FNEW_FUNC_API, const ACHAR* localname);

#ifdef UNICODE
#define FNewRegedit                 FNewRegeditW
#else
#define FNewRegedit                 FNewRegeditA
#endif

#endif